import 'package:dio/dio.dart';
import 'package:sharecommmunit/utils/eventbus.dart';
import 'package:sharecommmunit/utils/toast.dart';
import 'package:sharecommmunit/utils/token.dart';
import 'package:sharecommmunit/main.dart';

class NetworkService {
  final _dio = Dio();

  NetworkService() {
    // 配置基础地址
    _dio.options.baseUrl = 'https://live-api.itheima.net';
    // 设置连接超时时间
    _dio.options.connectTimeout = const Duration(seconds: 5);
    // 设置接收超时时间
    _dio.options.receiveTimeout = const Duration(seconds: 5);
    // 设置请求头
    _dio.options.headers = {'Content-Type': 'application/json'};
    // 添加请求和响应拦截器
    _addInterceptors();
  }

  /** 
   * 发起GET请求
   * [url] 请求的URL
   * [params] 请求的查询参数
   * 返回解析后的响应数据或错误信息
   */
  Future<dynamic> get(String url, {Map<String, dynamic>? params}) async {
    try {
      final response = await _dio.get(url, queryParameters: params);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  /** 
   * 发起POST请求
   * [url] 请求的URL
   * [data] 请求的主体数据
   * 返回解析后的响应数据或错误信息
   */
  Future<dynamic> post(String url, dynamic data) async {
    try {
      final response = await _dio.post(url, data: data);
      return handleResponse(response);
    } catch (e) {
      return handleError(e);
    }
  }

  // 其他 HTTP 方法封装...
  //仿照上面的post写一个put方法
  Future<dynamic> put(String url, dynamic data) async {
    try {
      final response = await _dio.put(url, data: data);
      return handleResponse(response); 
    }catch (e) {
      return handleError(e); 
    }
  }

  void _addInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        onRequest: (options, handler) async {
          // 请求拦截器：添加公共请求参数、token 等
          // todo
          final token = TokenManager().getToken();
          //有token就携带token
          if (token != null) {
            options.headers['Authorization'] = 'Bearer $token';
          }
          return handler.next(options);
        },
        onResponse: (response, handler) {
          // 响应拦截器：统一处理成功响应
          return handler.next(response);
        },
        onError: (DioException error, handler) {
          // 响应拦截器：统一处理错误响应
          return handler.next(error);
        },
      ),
    );
  }

  dynamic handleResponse(Response response) {
    // axios 源码中 对于状态码的判断 也是 2xx 就是成功
    if (response.statusCode! >= 200 && response.statusCode! < 300) {
      return response.data;
    } else {
      //如果token过期了 就跳转到登录页
      if (response.statusCode == 401) {
        }
      throw Exception('请求失败，状态码：${response.statusCode}');
    }
  }

  dynamic handleError(error) {
    if (error is DioException) {
      if (error.type == DioExceptionType.connectionTimeout ||
          error.type == DioExceptionType.receiveTimeout) {
        throw Exception('网络连接超时');
      } else if (error.type == DioExceptionType.badResponse) {
         if (error.response?.statusCode == 401) {
          TokenManager().removeToken();
          ToastUtil.showError('登录失效');
          // 1. 移除本地的 token
          TokenManager().removeToken();
          // 3. 触发事件，通过事件通知登录页面退出登录
         navigatorKey.currentState?.pushNamedAndRemoveUntil(
            '/login',
            (route) => true,);// 清除所有路由栈
        } else {
          throw Exception('响应错误，状态码：${error.response?.statusCode}');
        }
        throw Exception('响应错误，状态码：${error.response?.statusCode}');
      } else {
        throw Exception('网络请求错误：$error');
      }
    } else {
      throw Exception('未知错误：$error');
    }
  }
}

// 导出
final http = NetworkService();
